package com.game.modular.game.battle.info.base;

import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PvpPlayerInfo {
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("对战id")
    private Long matchId;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("铜钱加成")
    private Long copperRateCombined;
    @ApiModelProperty("粮食加成")
    private Long grainRateCombined;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("玩家id")
    private Long playerId;
    @ApiModelProperty("排名")
    private Integer ranking;
    @ApiModelProperty("是否为统治者")
    private Integer isRuler;
    @ApiModelProperty("友军uid,包括自己")
    private Set<Long> alliesUidList = new HashSet<>();
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("历史最高拥有城池排名")
    private Integer maxCityRank;
    @ApiModelProperty("历史最高拥有城池")
    private Integer maxCity;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("存活时间排名")
    private Integer survivalTimeRank;
    @ApiModelProperty("是否死亡")
    private Integer isDead;
    @ApiModelProperty("加入游戏时间(毫秒)")
    private Long joinTime;
    @ApiModelProperty("存活时间,分钟")
    private Long survivalTime;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("是否退出")
    private Integer isExit;
    @ApiModelProperty("当前拥有的城池数量排名")
    private Integer currentCityRank;
    @ApiModelProperty("当前拥有的城池")
    private Set<Long> currentCity;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("击败玩家数量排名")
    private Integer killedPlayersRank;
    @ApiModelProperty("累计击败玩家")
    private Set<Long> killedPlayers;
    @ApiModelProperty("被谁击杀")
    private Long killedBy;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    @ApiModelProperty("累计击败玩家获取的经验")
    private Long totalExp;
    @ApiModelProperty("累计击败玩家获取的积分")
    private Long totalIntegral;
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    /**
     * 设置生存时间
     */
    public void setSurvivalTime() {
        if (survivalTime == null){
            survivalTime = 0L;
            isDead = 0;
            isExit = 0;
            survivalTimeRank = 1;
        }
        if (currentCity==null||currentCity.isEmpty()){
            survivalTime = (new Date().getTime() - joinTime) / 1000 / 60;
            isDead = 1;
        }
    }

    /**
     * 城池失守 统计存活时间|击杀者
     *
     * @param killedBy 杀手
     * @param coreId 城池id
     */
    public void removeAndFlushCityInfo(Long killedBy, Long coreId) {
        currentCity.remove(coreId);
        if (currentCity.isEmpty()) {// 丢光城池
            long survivalTimeMillisecond = new Date().getTime() - joinTime;
            survivalTime = survivalTimeMillisecond / 1000 / 60;
            setKilledBy(killedBy);
        }
    }

    /**
     * 更新 当前城池|历史最高城池
     *
     * @param coreId 城池id
     */
    public void obtainAndFlushCityInfo(Long coreId) {
        if (currentCity == null){
            currentCity = new HashSet<>();
        }
        if (maxCity == null){
            maxCity = 0;
        }
        currentCity.add(coreId);
        maxCity = Math.max(maxCity, currentCity.size());
    }

    /**
     * 获取击杀胜点
     */
    public void claimKillPoints(Long playerId, long integral) {
        if (killedPlayers == null){
            killedPlayers = new HashSet<>();
        }if (totalIntegral == null){
            totalIntegral = 0L;
        }
        killedPlayers.add(playerId);

        totalIntegral += integral;
    }

    /**
     * 获取经验
     * @param exp 经验
     */
    public void obtainExp(long exp) {
        if (totalExp == null){
            totalExp = 0L;
        }
        totalExp += exp;
    }
}